/*
 * @Author: 晴鸢. 3013433857@qq.com
 * @Date: 2025-09-09 11:40:54
 * @LastEditors: 晴鸢. 3013433857@qq.com
 * @LastEditTime: 2025-09-10 19:25:30
 * @FilePath: /Learn/signal set/mysignal.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include<iostream>
#include<unistd.h>
#include<signal.h>
using namespace std;

//查询已到达但未处理的信号
void Printpending(sigset_t &pending)
{
    for(int signo=1;signo<=31;signo++)
    {
        //查询信号是否在信号集中
        if(sigismember(&pending,signo))
        {
            cout<<"1";
        }
        else cout<<"0";
    }
    cout<<endl;
}


void header(int signo)
{
    cout<<"catch a signo:"<<signo<<endl;
}

void test1()
{
    //捕捉信号
    signal(2,header);
    //1.先对2号信号进行屏蔽
    sigset_t bset,oset;//在用户区上开辟空间
    //初始化位图空间
    sigemptyset(&bset);
    sigemptyset(&oset);
    //向指定的信号集添加新的信号
    sigaddset(&bset,2);
    //写入新信号，保存旧信号
    sigprocmask(SIG_SETMASK,&bset,&oset);
    int cnt=0;
    sigset_t pending;
    while(1)
    {
        //获取pending信号集
        int n=sigpending(&pending);
        if(n<0) continue;
        Printpending(pending);
        sleep(1);

        cnt++;
        //解除阻塞
        if(cnt==20)
        {
            cout<<"unblock 2 signo"<<endl;
            sigprocmask(SIG_SETMASK,&oset,nullptr);
        }
    }
}

void test2()
{
    //屏蔽所有信号后信号还会被处理吗
    sigset_t bset,oset;
    sigemptyset(&bset);
    sigemptyset(&oset);
    for(int i=1;i<=31;i++)
    {
        sigaddset(&bset,i);
    }
    sigprocmask(SIG_SETMASK,&bset,&oset);
    sigset_t pending;
    while(1)
    {
        int n=sigpending(&pending);
        if(n<0) continue;
        Printpending(pending);
        sleep(1);
    }
}
int main()
{
    test1();
    //test2();
    return 0;
}